/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package grafika;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import logika.Hra;
import logika.Prostor;

/**
 *
 * @author xkovt09
 */
public class PanelVychodu extends JPanel implements Predplatitel {

    private JList vychodyList;
    private DefaultListModel listModel;
    private Hra hra;
    private GUI gui;

    public PanelVychodu(Hra hra, GUI gui) {
        this.hra = hra;
        this.gui = gui;

        Color text = new Color(19, 179, 83);

        this.setLayout(new BorderLayout());
        // vytvořím DefaultListModel
        listModel = new DefaultListModel();
        vychodyList = new JList(listModel);
        vychodyList.setBorder(BorderFactory.createTitledBorder(null, "Východy", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, null, Color.yellow));
        vychodyList.setBackground(Color.BLACK);
        vychodyList.setForeground(text);
        this.add(vychodyList, BorderLayout.CENTER);
        // bude možné vybrat pouze jednu položku
        vychodyList.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        // přiřadím ovladač k SelectionModel-u od vychodyList (JList)
        vychodyList.getSelectionModel().addListSelectionListener(new OvladacVychodu());
        // nastavuji velikost JList-u, nutné upravit na konkrétní podmínky,
        // velikost může být přepsána správcem rozvržení,
        vychodyList.setPreferredSize(new Dimension(120, 70));
        // nastavuji cellrenderer
        vychodyList.setCellRenderer(new ZobrazeniPolozkyListu());
    }

    /**
     * Musím překrýt metodu setEnabled ze třídy JPanel a v ní nastavit i
     * setEnabled pro vychodyList, jinak bude JList aktivní i pokud dám
     * na celý panel setEnabled(false).
     *
     * @param enabled
     */
    @Override
    public void setEnabled(boolean enabled) {
        super.setEnabled(enabled);
        vychodyList.setEnabled(enabled);
    }

    @Override
    public void refresh() {
        listModel.removeAllElements();
        for (Prostor vychod : hra.getHerniPlan().getAktualniProstor().getVychody()) {
            listModel.addElement(vychod);
        }
    }

    public void setHra(Hra hra) {
        this.hra = hra;
    }

    /**
     * Ovladač, který se používá ve vychodyList (JList) - pokud si uživatel
     * vybere nějakou položku ze seznamu, vyvolá se příkaz "jdi východ"
     */
    private class OvladacVychodu implements ListSelectionListener {

        @Override
        public void valueChanged(ListSelectionEvent e) {
            if (!e.getValueIsAdjusting()) {     // skončil výběr položky
                // uživatel nějakou položku vybral
                if (vychodyList.getSelectedIndex() != -1) {
                    Prostor vychod = (Prostor) vychodyList.getSelectedValue();
                    gui.provedPrikaz("jdi " + vychod.getNazev());
                }
            }
        }
    }

    /**
     * Vnitřní třída, která vrací komponentu, pomocí které se vykreslují jednotlivé
     * položky v JList - tentokrát pro zobrazení jmen východů
     *
     * podívejte se na http://download.oracle.com/javase/tutorial/uiswing/components/combobox.html#renderer
     *
     */
    private class ZobrazeniPolozkyListu implements ListCellRenderer {

        // pro kreslení položek v JList a v JCombobox se obvykle používá JLabel,
        private JLabel kresliciKomponenta;

        public ZobrazeniPolozkyListu() {
            kresliciKomponenta = new JLabel();
            kresliciKomponenta.setOpaque(true);  // jinak JLabel nekreslí pozadí
        }

        @Override
        public Component getListCellRendererComponent(
                JList list,
                Object value,
                int index,
                boolean isSelected,
                boolean cellHasFocus) {

            if (isSelected) {
                kresliciKomponenta.setBackground(list.getSelectionBackground());
                kresliciKomponenta.setForeground(list.getSelectionForeground());
            } else {
                kresliciKomponenta.setBackground(list.getBackground());
                if (list.isEnabled()) {
                    kresliciKomponenta.setForeground(list.getForeground());
                } else {
                    // vytvářím novou barvu s poloviční průhledností (alfa kanal = 127)
                    Color barvaDisabled = new Color(
                            list.getForeground().getRed(),
                            list.getForeground().getGreen(),
                            list.getForeground().getBlue(),
                            127);
                    kresliciKomponenta.setForeground(barvaDisabled);
                }
            }
            Prostor vychod = (Prostor) value;
            kresliciKomponenta.setText(vychod.getNazev());
            kresliciKomponenta.setToolTipText(vychod.getPopis());
            // následuje ukázka, jak by bylo možné nastavit např. pro zamčený
            // východ font na Italic (já nemám zamčené místnosti, tak jsem vybral jednu konkrétní)
            if (vychod.jeZamceno()) {
                kresliciKomponenta.setFont(list.getFont().deriveFont(Font.ITALIC));
            }
            else if (vychod.jeHlidana()){
                kresliciKomponenta.setFont(list.getFont().deriveFont(Font.ITALIC));
            }
            else if (vychod.jeNebezpecna()){
                kresliciKomponenta.setFont(list.getFont().deriveFont(Font.ITALIC));
                kresliciKomponenta.setForeground(Color.red);
            }
            else {
                kresliciKomponenta.setFont(list.getFont());
            }
            return kresliciKomponenta;
        }
    }
}
